# Build the kernel
CC := i386-elf-gcc
LD := i386-elf-ld
BIN_DIR = bin
ALL_SOURCE_FILES := $(wildcard kernel/*.cpp) $(wildcard lib/*.cpp)
ALL_OBJS := $(BIN_DIR)/kernel_entry.o $(BIN_DIR)/kernel_init.okernel $(BIN_DIR)/basic_io.okernel $(BIN_DIR)/basic_mem_util.okernel $(BIN_DIR)/fs.okernel $(BIN_DIR)/zio.olib $(BIN_DIR)/zstring.olib $(BIN_DIR)/zstringutil.olib $(BIN_DIR)/zassert.olib $(BIN_DIR)/zmem.olib $(BIN_DIR)/vga.odriver $(BIN_DIR)/ata.odriver $(BIN_DIR)/instr.odriver
CXX_FLAGS := -static -O2 -m32 -std=c++20 -ffreestanding -nostdlib -L/usr/local/i386elfgcc/lib/gcc/i386-elf/11.2.0 -lgcc -L/usr/local/i386elfgcc/lib -lsupc++
LD_FLAGS := -static -L/usr/local/i386elfgcc/lib/gcc/i386-elf/11.2.0 -lgcc -L/usr/local/i386elfgcc/lib -lsupc++

# First, create a blank 1.44 MB (1,440 KB) floppy disk
# Second, copy os.bin to os_floppy.img
$(BIN_DIR)/os.hdd: $(BIN_DIR)/os.bin
	dd if=/dev/zero of=$@ bs=1024 count=1024 conv=notrunc
	dd if=$^ of=$@ bs=512 conv=notrunc

$(BIN_DIR)/os.bin: $(BIN_DIR)/boot.bin $(BIN_DIR)/kernel.bin
	cat $^ > $@

$(BIN_DIR)/boot.bin: boot/boot.asm
	nasm -f bin $^ -o $@

$(BIN_DIR)/kernel_entry.o: boot/kernel_entry.asm
	nasm -f elf32 $^ -o $@

$(BIN_DIR)/%.okernel: kernel/%.cpp
	$(CC) -Iinclude -c -o $@ $^ $(CXX_FLAGS) -lstdc++

$(BIN_DIR)/%.odriver: drivers/%.cpp
	$(CC) -Iinclude -c -o $@ $^ $(CXX_FLAGS) -lstdc++

$(BIN_DIR)/%.olib: lib/%.cpp
	$(CC) -Iinclude -c -o $@ $^ $(CXX_FLAGS) -lstdc++

$(BIN_DIR)/kernel.elf: $(ALL_OBJS)
	$(LD) -o $@ -Ttext=0x1000 $(LD_FLAGS) -elf32 $^

$(BIN_DIR)/kernel.bin: $(BIN_DIR)/kernel.elf
	$(LD) -o $@ -Ttext=0x1000 $^ --oformat=binary

clean:
	rm $(BIN_DIR)/*
